package com.frame.library.skin;

import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.util.Log;

import java.io.File;
import java.lang.reflect.Method;

/**
 * Added by Tom on 2024/07/02.
 * 皮肤的资源管理，获取资源都是通过它获取。
 */
public class SkinResource {
    private static final String TAG = "SkinResource";
    // 资源 都通过这个对象来获取
    private Resources mSkinResource;
    // 【app/皮肤插件包】 的包名
    private String mPackageName;

    // eg：skinPath = Environment.getExternalStorageDirectory().getAbsolutePath() +
    //                File.separator + "red.skin"
    public SkinResource(Context context, String skinPath) {
        try {
            //获取【apk/皮肤插件包】 的包名
            mPackageName = context.getPackageManager()
                    .getPackageArchiveInfo(skinPath, PackageManager.GET_ACTIVITIES)
                    .packageName;
            // Log.d(TAG, "mPackageName===>" + mPackageName);

            //读取本地资源  *.skin里面的资源
            Resources superRes = context.getResources();
            //创建AssetManager，不能new，使用【反射创建对象】。
            AssetManager asset = AssetManager.class.getDeclaredConstructor().newInstance();
//            AssetManager asset = AssetManager.class.newInstance();
            //添加本地下载好的资源皮肤  Native层
            Method method = AssetManager.class.getDeclaredMethod("addAssetPath", String.class);
            method.setAccessible(true); //允许私有方法 可访问
            // 【反射执行方法 addAssetPath】
            method.invoke(asset, skinPath); // red.skin 皮肤压缩包，这个皮肤 保存在手机根目录下。
            mSkinResource = new Resources(asset, superRes.getDisplayMetrics(), superRes.getConfiguration());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String getCurrentPackageName() {
        return mPackageName;
    }

    /**
     * 通过名字获取Drawable
     *
     * @param resName
     * @return
     */
    public Drawable getDrawableByName(String resName) {
        try {
            // 资源名字，类型是drawable，最后传包名。1.先获取资源的id。
            int resId = mSkinResource.getIdentifier(resName, "drawable", mPackageName);
            if (resId == 0) return null;

            // Log.d(TAG, "drawable===>" + resId);
            Drawable drawable = mSkinResource.getDrawable(resId); // 2.通过资源id，获取图片资源
            return drawable;
        } catch (Exception e) { // 避免拿不到资源
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 通过名字获取颜色 -- ColorStateList
     *
     * @param resName
     * @return
     */
    public ColorStateList getColorByName(String resName) {
        try {
            // 资源名字，类型是 color，最后传包名。
            int resId = mSkinResource.getIdentifier(resName, "color", mPackageName);
            // Log.d(TAG, "color===>" + resId);
            ColorStateList color = mSkinResource.getColorStateList(resId);
            return color;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

}
